package cn.nawang.ebeim.client.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import cn.nawang.ebeim.client.bean.License;
import cn.nawang.ebeim.client.exception.RootException;

/**
 * @ClassName: LicenseVerify
 * @Description: 授权验证
 * @author fanyb
 * @date Aug 20, 2015 4:30:38 PM
 * @version v1.0
 */
public class LicenseVerifyUtil {

  /**
   * 
   * @author fanyb
   * @Description: 从外部CMD调用进行校验
   * @param licenseInfoStr
   * @return License
   * @throws RootException
   * 
   * @date Aug 20, 20154:35:23 PM
   *
   * @修改人
   * @修改日期
   */
  public final static License parseLicenseInfoCmd(String licenseStr) throws RootException {
    try {
      JSONObject jsonObject = JSON.parseObject(licenseStr);
      return new License(0, 0, 0, "", jsonObject.getString("licenseID"),
          jsonObject.getString("licensePassword"), jsonObject.getString("terminalID"),
          /*
           * new String( Base64.decodeBase64(jsonObject .getString("customName")))
           */
          jsonObject.getString("customID"), jsonObject.getString("customID"),
          jsonObject.getString("deviceID"));
    } catch (Throwable e) {
      throw new RootException("解析授权文件失败。", e);
    }
  }

  /**
   * 
   * @Description: <pre>
   * 解析授权文件
   * </pre>
   * @return
   * @throws NWException
   */
  public final static License parseLicenseInfo() throws RootException {
    File[] licenseFiles = scanLicenseFile();
    if (licenseFiles == null || licenseFiles.length == 0) {
      // 不存在授权文件
      return null;
    }
    // 如果有多个授权文件
    if (licenseFiles.length > 1) {
      throw new RootException("存在多个授权文件，请先删除多余的授权文件！");
    }
    // 进行授权文件的校验
    if (!checkFileName(licenseFiles[0])) {
      throw new RootException("授权文件校验失败：请检查文件是否被改动！");
    }
    return parseFile(licenseFiles[0]);
  }

  /**
   * 
   * @Description: <pre>
   * 在当前工作目录区域下寻找授权文件
   * </pre>
   * @return
   * @throws NWException
   */
  private final static File[] scanLicenseFile() throws RootException {
    File rootDir = new File(PathUtil.getClassPath());
    File[] licenseFiles = rootDir.listFiles(new FilenameFilter() {
      @Override
      public boolean accept(File dir, String name) {
        if (name.endsWith(".license")) {
          return true;
        }
        return false;
      }
    });
    return licenseFiles;
  }

  /**
   * 
   * @author fanyb
   * @Description: 校验授权文件的合法性 确保授权文件没有被改动过
   * @param licenseFile 授权文件
   * @return boolean 文件是否被改动过
   * @throws RootException
   * @date Aug 20, 20154:49:07 PM
   *
   * @修改人
   * @修改日期
   */
  private final static boolean checkFileName(File licenseFile) throws RootException {
    FileInputStream fin = null;
    try {
      String licenseContent = FileOperation.readTxtFile(licenseFile);
//      /** Base64编码 **/
//      String licenseNameBase64 = Base64Util.getBase64(licenseContent);
//      /** md5加密 **/
//      String licenseNameBase64Md5 = MD5Util.string2MD5(licenseNameBase64);
//      /** md5加密 **/
//      String licenseNameBase64Md5Md5 = MD5Util.string2MD5(licenseNameBase64Md5);
      /** md5加密 **/
      String licenseNameBase64Md5Md5 = MD5Util.string2MD5(licenseContent);
      // 如果签名一致
      if (licenseFile.getName().compareToIgnoreCase(licenseNameBase64Md5Md5 + ".license") == 0) {
        return true;
      }
      return false;
    } catch (Throwable e) {
      throw new RootException("解析授权文件失败。", e);
    } finally {
      if (fin != null) {
        try {
          fin.close();
        } catch (IOException e) {}
      }
    }
  }

  /**
   * 
   * @author fanyb
   * @Description: 解析授权文件
   * @param licenseFile 授权文件
   * @return License 授权信息
   * @throws RootException
   * 
   * @date Aug 20, 20155:08:26 PM
   *
   * @修改人
   * @修改日期
   */
  private final static License parseFile(File licenseFile) throws RootException {
    // 是否发生错误
    try {
//      String licenseContentDesAndBase64 = FileOperation.readTxtFile(licenseFile);
//      // 解密 解密步骤为
//      // BASE64
//      String licenseContentDes=Base64Util.getFromBase64(licenseContentDesAndBase64);
//      // DES解密
//      String licenseContent=DesUtil.decrypt(licenseContentDes, Constants.DESKEY);
      String licenseContentDesAndBase64 = FileOperation.readTxtFile(licenseFile);
      JSONObject jsonObject = JSON.parseObject(licenseContentDesAndBase64);
      return new License(jsonObject.getLongValue("startTime"), jsonObject.getLongValue("endTime"),
          jsonObject.getLongValue("bindTime"), jsonObject.getString("bindOptUser"),
          jsonObject.getString("licenseID"), jsonObject.getString("licensePassword"),
          jsonObject.getString("terminalID"), jsonObject.getString("customName"),
          jsonObject.getString("customID"), jsonObject.getString("deviceID"));
    } catch (Throwable e) {
      throw new RootException("解析授权文件失败。", e);
    }
  }
}
